#include "http.hpp"

// int main()
// {
//     // std::string str = "abc/accc/dfsd/////llll///";
//     // std::vector<std::string> vec;
//     // std::cout << Util::Split(str, "/", &vec) << std::endl;
//     // for (auto e : vec) std::cout << e << std::endl;
//     // std::string buf;
//     // std::string filename = "./test.cc";
//     // Util::ReadFile(filename, &buf);
//     // std::string filename2 = "test.txt";
//     // Util::WriteFile(filename2, buf);

//     // std::string str = "+";
//     // std::string res;
//     // for (auto &e : str)
//     // {
//     //     char tmp[4] = {0};
//     //     snprintf(tmp, 4, "%%%x", e);
//     //     std::cout << tmp << std::endl;
//     // }

//     // std::string str = "C  ";
//     // std::string res = Util::UrlEncode(str, true);
//     // std::string tmp = Util::UrlDecode(res, true);

//     // std::cout << "[" << res << "]\n";
//     // std::cout << "[" << tmp << "]\n";   
//     // std::cout << Util::StateDesc(100) << std::endl;

//     std::cout << Util::IsRegular("test.cc") << std::endl;
//     std::cout << Util::IsDirectory("test.cc") << std::endl;

//     return 0;
// }


#define WWWROOT "./wwwroot/"

std::string RequestStr(const HttpRequest &req)
{
    std::stringstream ss;
    ss << req._method << " " << req._path << " " << req._version << "\r\n";
    for (auto &e : req._params)
    {
        ss << e.first << ":" << e.second << "\r\n";
    }
    for (auto &e : req._headers)
    {
        ss << e.first << ":" << e.second << "\r\n";
    }
    ss << "\r\n";
    ss << req._body;
    return ss.str();
}


void HelloPrint(const HttpRequest &req, HttpResponse *resp)
{
    resp->SetContent(RequestStr(req), "text/html");
}

void LoginPrint(const HttpRequest &req, HttpResponse *resp)
{
    resp->SetContent(RequestStr(req), "text/html");
}


void PostPrint(const HttpRequest &req, HttpResponse *resp)
{
    resp->SetContent(RequestStr(req), "text/html");
}


void PutPrint(const HttpRequest &req, HttpResponse *resp)   
{
    std::string pathname = WWWROOT + req._path;
    Util::WriteFile(pathname, req._body);
}


void DeletePrint(const HttpRequest &req, HttpResponse *resp)
{
    resp->SetContent(RequestStr(req), "text/html");
}

int main()
{
    HttpServer server(8080);
    server.SetThreadCount(2);
    server.SetBaseDir(WWWROOT);  /*设置静态资源根目录， 告诉服务器有静态资源到来，需要那里去找资源文件*/
    server.get("/hello", HelloPrint);     /*将正则表达式和请求方法都给传过去。 然后到时候分发的时候直接调用*/
    server.get("/login", LoginPrint);
    server.Post("/Post", PostPrint);
    server.Put("/1234.txt", PutPrint);
    server.Delete("/1234.txt", DeletePrint);
    server.Listen();
    return 0;
}